<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 先分析功能的实现，先把结果写出来，然后倒推它 的实现
        const item = makeIterator(['html','css','javascript'])
        console.log(item.next());
        console.log(item.next());
        console.log(item.next());
        console.log(item.next());

        function makeIterator(arr){

            let nextIndex  = 0
            return {
                next() {
                    // if(nextIndex === 3){
                    //     return {value:undefined,done:true}
                    // }else {
                    //     let obj = {value: arr[nextIndex],done:false}
                    //     nextIndex ++
                    //     return obj
                    // }
                    return nextIndex === arr.length
                                    ?{value:undefined,done:true}
                                    :{value:arr[nextIndex++],done:false }
                }
            }
        }

        
        // const ind = makeIterator(['html','css','javascript'])
        // function makIterator(arr){
        //     let nextIndex = 0
        //     return {
        //         next:function(){
        //             if(nextIndex === 3) {
        //                 return {value:undefined,done:true} 
        //             }else{
        //                 let obj = {value:arr[nextIndex],done:false}
        //                 nextIndex ++
        //                 return obj
        //             }
        //         }
        //     }
        // }



        //对象本身没有部署接口，如果需要使用iterator可遍历的话，那么就自己根据需求写一个
        // var user = {
        //     name:'王德发',
        //     age:'18'
            
        // }
        // let it = [Symbol.iterator]()

        // console.log(it);

        // 闭包其实实现了跨作用域访问变量，因为使用闭包会是变量常驻内存，滥用闭包会造成内存泄漏/堆栈溢出

        var arr = new Set(['html','css','javascript','react','vue'])
        //for in 该遍历语法能直接取到的是对象或数组的属性名
        // for of 该遍历语法能直接取到数组的值
        // for(){

        // }

    </script>
</body>
</html>